package negocio;

import interfaces.AdministradorLog;
import interfaces.AdministradorVenta;

import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import clientesWS.LogisticaMonitoreoBeanService;
import clientesWS.LogisticaMonitoreoWS;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

import constantes.ConstantesConfig;
import dtos.ItemVentaDTO;
import dtos.LogDTO;
import dtos.RespuestaDTO;
import dtos.VentaDTO;
import entities.ConfiguracionLog;
import entities.ItemVenta;
import entities.Usuario;
import entities.Venta;

/**
 * Session Bean implementation class AdministradorVentaBean
 */
@Stateless
@LocalBean
public class AdministradorVentaBean implements AdministradorVenta {
	
	@PersistenceContext
	EntityManager em;
	
	@EJB
	private AdministradorLog admLog;

	
    public AdministradorVentaBean() {
    }
    
	public VentaDTO guardarVenta(List<ItemVenta> items, Usuario u) {
		Venta venta = new Venta();
		
		venta.setUsuario(u);
		
		VentaDTO ventaDTO = new VentaDTO();		
		
		if(items.size() > 0){
			
			for(ItemVenta iv: items){
				venta.addItemVenta(iv);
			}
			
			//Parametros fijos de la Venta
			SimpleDateFormat sdf = admLog.getSdf();
	    	Date today = Calendar.getInstance().getTime();
			venta.setFechaVenta(sdf.format(today));
			venta.setEstadoEntrega("Pendiente");
			venta.setIdModulo( String.valueOf(ConstantesConfig.ID_MODULO) );
			
			venta.setCoordenadaX(u.getCoordenadaX());
			venta.setCoordenadaY(u.getCoordenadaY());
			
			em.persist(venta);
			ventaDTO = venta.instanciaDTO();
			
			String mensaje = "La venta nro: " + venta.getNroVenta() + " se guardo correctamente";
			String estado = "OK";
			
			//Log a Enviar
			admLog.enviarLogSegunConfig( mensaje );
			
			//Log Nuestro
			admLog.persistirLogClienteCompleto(estado,mensaje);

			try{
				ConfiguracionLog cfgLog = admLog.obtenerConfiguracionActualLog();
				informarVenta(ventaDTO, cfgLog);
			}catch(Exception e){}
		
			em.flush();
		}
		return ventaDTO ;
	}
	

	public void informarVenta ( VentaDTO  ventaDTO, ConfiguracionLog cfgLog ) {
		
		//Mapeo de la venta actual a XML
    	XStream xstream = new XStream(new DomDriver());
    	xstream.processAnnotations(VentaDTO.class);
		xstream.processAnnotations(ItemVentaDTO.class);
		
    	String ventaXML = xstream.toXML(ventaDTO);
    	
    	String urlDestino = "";
    	if ( cfgLog != null ) {
    		urlDestino = cfgLog.getUrlDestino();
    	}
    	
    	try {
    		
			URL url = new URL(urlDestino + "?wsdl");
			
			//Creacion cliente WS
	    	LogisticaMonitoreoBeanService service1 = new LogisticaMonitoreoBeanService(url);

	    	//Obtencion del puerto
	    	LogisticaMonitoreoWS port1 = service1.getLogisticaMonitoreoWSPort();
	    	
	    	//Envio la venta al modulo de L y M
	    	String respuestaLyM = port1.informarVenta(ventaXML);
	    	
	    	//Se informa la venta
	    	RespuestaDTO rtaDTO = new RespuestaDTO(); 
	    	
	    	if ( respuestaLyM != null )
	    		rtaDTO = (RespuestaDTO) xstream.fromXML( respuestaLyM );
	    	
	    	rtaDTO.setEstado("0");
			rtaDTO.setMensaje("Enviado con JMS");
			
			LogDTO logDTO = new LogDTO();
			//Agrego fecha al logDTO
	    	SimpleDateFormat sdf = admLog.getSdf();
	    	Date today = Calendar.getInstance().getTime();
			logDTO.setFecha(sdf.format(today));
			logDTO.setIdModulo(ConstantesConfig.ID_MODULO);
			logDTO.setMensaje("Se informo la venta nro: " + ventaDTO.getNroVenta());
			
			if ( admLog != null )
				admLog.persistirLogCliente(rtaDTO, logDTO);
	    	
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

	

}
